// 给定一个整数数组，其中第 i 个元素代表了第 i 天的股票价格 。​

// 设计一个算法计算出最大利润。在满足以下约束条件下，你可以尽可能地完成更多的交易（多次买卖一支股票）:

// 你不能同时参与多笔交易（你必须在再次购买前出售掉之前的股票）。
// 卖出股票后，你无法在第二天买入股票 (即冷冻期为 1 天)。

// 来源：力扣（LeetCode）
// 链接：https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-with-cooldown
// 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。

#include<bits/stdc++.h>
#include<string>
#include<vector>
#include<unordered_set>
#include<set>
#include<queue>
using namespace std;
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len<1){
            return 0;
        }
        vector<vector<int>> res(len,vector<int>(2));
        // 0代表当天进入卖出状态后的总收益（本身是卖出状态则不变，本身是买入状态则卖出进入卖出
        // 1代表当前买入后的总收益（本身是买入则不变，本身是卖出，则依据前两天卖出收益加上买入代价
        res[0][0] = 0; 
        // 第一天买入，收益为-
        res[0][1] = 0-prices[0];
        for(int i=1;i<len;i++){
            // 卖出收益
            // 如果前一天卖出了，今天就没有东西卖，收益等于前一天卖出；如果前一天买入了，今天直接卖出，等于买入收益+卖出价格
            res[i][0] = max(res[i-1][0],res[i-1][1]+prices[i]);

            // 买入收益
            // 本身为买入状态
            // 如果前一天买入，今天买入收益同前一天买入收益
            res[i][1] = res[i-1][1];

            // 本身为卖出状态
            if(i>1){
                // 大于两天
                res[i][1] = max(res[i][1],res[i-2][0]-prices[i]);
            }
            else{
                // 只有两天，第一天不可卖，第二天买
                res[i][1] = max(res[i][1],0-prices[i]);
            }
        }
        return res[len-1][0];
    }
};